昨天的文章寫到使用 EventBridge 和 SNS 實作 AWS 服務的及時通知
不過在串接 Amazon SNS 的時候都會發現一件事情
就是收到的內容不夠直觀
除此之外也會帶入很多 AWS 的原生訊息
如果我們想要客製化這些訊息
那就要在前方使用 AWS Lambda 才能夠將訊息轉化成更適合人閱讀的訊息
昨天很臨時的提到 Amazon SNS
那 Amazon SNS 是甚麼呢?
Amazon Simple Notification Service (Amazon SNS) 是一種受管服務
會提供從發佈者到訂閱者的訊息傳遞
Amazon SNS 提供兩種傳遞訊息的模式
一個是 Application to Application
也就是 Amazon SNS 收到訊息後接著串接到其他 AWS 的服務
另一個則是 Application to Person
就是我們以往常接觸到的 SNS 通知
可以直接發送訊息給終端使用者
想要知道如何使用 SNS 串接到 AWS Lambda 請參與這篇文章
本篇文章主要是講述如何從 Lambda 將訊息發佈到 Amazon SNS
在 SNS 的訂閱主題的 Access Policy 加入以下的權限
{
"Sid": "AllowFromLambda",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:sts::125919661051:assumed-role/{AWS Lambda Role Name}/{AWS Lambda Function Name}"
},
"Action": "sns:Publish",
"Resource": "{SNS 主題的 ARN}"
}
Lambda 程式調用 SNS
以官方提供的 Python 程式為例
是使用 boto3 這個第三方套件
先初始化一個 sns 的 client
然後再呼叫 publish 方法將資訊推送到 SNS
client.publish(TopicArn='topic arn',Message="Test message",Subject="Test Subject")
可以注意到的是官方只有兩個參數
如果是寄送 email 的話
參數使用 Subject 和 Message 則可以帶入標題和內容
import json
import boto3
client = boto3.client('sns')
def lambda_handler(event, context):
response = client.publish(TopicArn='arn:aws:sns:<region>:<account-number>:<topic-name>',Message="Test message")
print("Message published")
return(response)
§ 注意 §
如果 SNS 想串接 Microsoft Teams
需要做一些調整,不可以直接使用 Webhook
一個是使用 Email 的方式寄送
https://dev.to/aws-builders/how-to-send-aws-notifications-aws-sns-to-microsoft-teams-1d1l想要推送 Microsoft Teams 或 Slack 可能要直接使用 Lambda 推送
https://repost.aws/knowledge-center/sns-lambda-webhooks-chime-slack-teams
實作時,需要考量到 Security Group 有沒有開啟
以及 AWS Lambda 如果需要對外串接服務需要走 NAT Gateway 出外網
參考資料: